#pragma once
#include <iostream>
#include <vector>
#include <list>

using namespace std;

namespace ywx {
	template<class T, class Container = vector<T>>
	class stack {
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_back();
		}

		T& top()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	template<class T, class Container = list<T>>
	class queque {
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}
		void pop()
		{
			_con.pop_front();
		}

		T& front()  
		{
			return _con.front();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	void test_stack()
	{
		stack<int, vector<int>> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		while (!st.empty())
		{
			cout << st.top() << ' ';
			st.pop();
		}
		cout << endl;
		stack<int, list<int>> st2;
		st2.push(5);
		st2.push(6);
		st2.push(7);
		st2.push(8);
		while (!st2.empty())
		{
			cout << st2.top() << ' ';
			st2.pop();
		}
		cout << endl;
	}
}